package factorymethod;

import factorymethod.impl.factory.CandyFactory;
import factorymethod.impl.factory.CommonFactory;
import factorymethod.impl.factory.Factory;
import factorymethod.impl.factory.FruitFactory;
import factorymethod.impl.product.BookProduct;
import factorymethod.impl.product.Product;

/**
 * Reference:http://www.cnblogs.com/forlina/archive/2011/06/21/2086114.html
 * @author Administrator
 * 1. 工厂为抽象工厂（其他各种工厂类可以继承自它，实现多元化）
 * 2. 产品为抽象产品或接口类型产品（为具体产品提供统一操作）
 * 3. 要制作一个具体的产品，就需要有具体的工厂（实体工厂---->实体产品 相对应：不带参数的抽象工厂方法）
 * 4. 把要制作的具体产品类，作为参数，传给一个（带参数的）工厂方法，可以实现生产不同类型产品.
 *    (这里所有的产品类型 要是抽象类型或者接口的实现类）
 * 
 */
public class ClientTest {
	
	public static void main(String arg[])
	{
		//创建一个具体的工厂（具体的工厂可以是鞋厂，衣服厂，食品厂,汽车制造厂....）
		Factory   fruitFactory  = new FruitFactory();
		Product myProduct = fruitFactory.factoryMethod();
		myProduct.ProductDesc();
		System.out.println("==========================");
		Factory commonFactory = new CommonFactory();
		 Product books =  commonFactory.factoryMethod(BookProduct.class);
		 books.ProductDesc();
		 System.out.println("==========================");
		//准备建立一个糖果厂
		System.out.println("弄点糖来吧.......");
		Factory candyFactory = new CandyFactory();
		
		 Product candy = candyFactory.factoryMethod();
		 candy.ProductDesc();
	}

}
